import json
import logging
from base.types import TradeMessage, OrderResponse
from utils.exceptions import InvalidMessageFormat
from datetime import datetime

logger = logging.getLogger('trade.spi')

class TradeSpi:
    """交易回调接口（对应原LSpi的交易部分）"""
    def __init__(self):
        self.task_queue = None  # 由API初始化时注入

    def start(self, data_queue):
        """子进程入口（增加线程状态日志）"""
        logger.info("启动SPI消息处理线程")
        self.task_queue = data_queue
        try:
            while True:
                data = self.task_queue.get()
                if data is None:
                    logger.info("收到终止信号，退出消息循环")
                    break
 #               logger.debug(f"从队列获取消息: {data[:100]}...")  # 显示部分消息内容
                self._process_data(data)
        except Exception as e:
            logger.error(f"消息处理线程异常: {str(e)}")
        finally:
            logger.info("SPI消息处理线程已退出")

    def _process_data(self, raw_data: str):
        """处理原始数据（优化原队列处理逻辑）"""
        try:
            msg = json.loads(raw_data)
            logger.info(f"收到交易消息: {msg}")
            msg_type = msg.get("msgType")
            msg_data = msg.get("data", {})

            if msg_type == "@connected":
                self.on_connected()
            elif msg_type == "@disconnected":
                self.on_disconnected()
            elif msg_type == 3001:  # 登录响应
                self._handle_login_response(msg)
            elif msg_type == 1001:  # 请求确认响应
                self.on_ready(msg)
            elif msg_type == 5001:  # 委托响应
                self.on_rsp_order(msg_data)
            elif msg_type == 7001:  # 策略创建响应
                self.on_rsp_strategy·(msg_data)
            # 查询响应处理
            elif msg_type == 6000:  # 查询订单响应
                self.on_rsp_qry_order(msg_data)
            elif msg_type == 6002:  # 查询成交响应
                self.on_rsp_qry_trade(msg_data)
            elif msg_type == 6008:  # 查询持仓响应
                self.on_rsp_qry_position(msg_data)
            elif msg_type == 6010:  # 查询资金响应
                self.on_rsp_qry_account(msg_data)
            elif msg_type == 6012:  # 查询策略响应
                self.on_rsp_qry_strategy(msg_data)
            elif msg_type == 6014:  # 查询合约响应
                self.on_rsp_qry_instrument(msg_data)
            elif msg_type == 6016:  # 黑名单推送
                self.on_rsp_black_list(msg_data)    
            # 推送数据处理
            elif msg_type == 8000:  # 订单回报
                self.on_rtn_order(msg_data)
            elif msg_type == 8001:  # 成交回报
                self.on_rtn_trade(msg_data)
            elif msg_type == 8002:  # 持仓回报
                self.on_rtn_position(msg_data)
            elif msg_type == 8003:  # 资金回报
                self.on_rtn_account(msg_data)
            elif msg_type == 8004:  # 策略回报
                self.on_rtn_strategy(msg_data)
            
            else:
                logger.warning(f"未知交易消息类型: {msg_type}")
        except json.JSONDecodeError:
            raise InvalidMessageFormat(raw_data)
        except Exception as e:
            logger.error(f"交易消息处理失败: {str(e)}")

    def _handle_login_response(self, msg: dict):
        """处理登录响应（匹配XWebTrd.c的响应格式）"""
        logger.info(f"收到登录响应: {msg}")
        if msg.get("errorId") == 0:
            logger.debug("更新交易登录状态为已登录")
            self.api.update_login_status(True)
            self.on_login(True)
        else:
            error_msg = msg.get("errorMsg", "未知错误")
            logger.error(f"登录失败: {error_msg}")
            self.on_login(False, error_msg)

    def on_connected(self):
        """连接建立回调"""
        logger.info("交易服务器连接已建立")

    def on_disconnected(self):
        """连接断开回调"""
        logger.info("交易服务器连接已断开")

    def on_error(self, error):
        """错误回调"""
        logger.error(f"交易服务器错误: {error}")

    def on_message(self, message):
        """消息回调"""
        logger.debug(f"收到交易服务器消息: {message}")

    def on_login(self, success, error_msg=None):
        """登录回调"""
        if success:
            logger.info("交易服务器登录成功")
        else:
            logger.error(f"交易服务器登录失败: {error_msg}")

    def on_order(self, order_data: TradeMessage):
        """订单回调"""
        logger.info(f"收到订单回报: {order_data}")

    def on_ready(self, msg: dict):
        """请求认证回调"""
        logger.info(f"收到请求认证消息: {msg}")

    # 查询响应函数
    def on_rsp_qry_order(self, rsp_data):
        """查询订单响应"""
        logger.info(f"收到查询订单响应: {rsp_data}")
        
    def on_rsp_qry_trade(self, rsp_data):
        """查询成交响应"""
        logger.info(f"收到查询成交响应: {rsp_data}")
        
    def on_rsp_qry_position(self, rsp_data):
        """查询持仓响应"""
        logger.info(f"收到查询持仓响应: {rsp_data}")
        
    def on_rsp_qry_account(self, rsp_data):
        """查询资金响应"""
        logger.info(f"收到查询资金响应: {rsp_data}")
        
    def on_rsp_qry_strategy(self, rsp_data):
        """查询策略响应"""
        logger.info(f"收到查询策略响应: {rsp_data}")
        
    def on_rsp_qry_instrument(self, rsp_data):
        """查询合约响应"""
        logger.info(f"收到查询合约响应: {rsp_data}")

    def on_rsp_black_list(self, rsp_data):
        """黑名单响应"""
        logger.info(f"收到黑名单响应: {rsp_data}")

    # 推送数据函数
    def on_rtn_order(self, order_data):
        """订单状态推送"""
        logger.info(f"收到订单状态推送: {order_data}")
        
    def on_rtn_trade(self, trade_data):
        """成交回报推送"""
        logger.info(f"收到成交回报推送: {trade_data}")
        
    def on_rtn_position(self, position_data):
        """持仓变动推送"""
        logger.info(f"收到持仓变动推送: {position_data}")
        
    def on_rtn_account(self, account_data):
        """资金变动推送"""
        logger.info(f"收到资金变动推送: {account_data}")
        
    def on_rtn_strategy(self, strategy_data):
        """策略状态推送"""
        logger.info(f"收到策略状态推送: {strategy_data}")

    def on_rsp_order(self, rsp_data):
        """委托响应处理(5001)"""
        logger.info(f"收到委托响应: {rsp_data}")
        req_id = rsp_data.get("reqId", 0)
        error_id = rsp_data.get("errorId", 0)
        
        if error_id == 0:
            logger.info(f"委托成功，订单号: {rsp_data.get('orderId')}")
        else:
            error_msg = rsp_data.get("errorMsg", "未知错误")
            logger.error(f"委托失败: {error_msg}")

    def on_rsp_strategy(self, rsp_data):
        """策略创建响应处理(7001)"""
        logger.info(f"收到策略创建响应: {rsp_data}")
        req_id = rsp_data.get("reqId", 0)
        error_id = rsp_data.get("errorId", 0)
        
        if error_id == 0:
            strategy_id = rsp_data.get("strategyId")
            logger.info(f"策略创建成功，ID: {strategy_id}")
        else:
            error_msg = rsp_data.get("errorMsg", "未知错误")
            logger.error(f"策略创建失败: {error_msg}")
